iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
4

簡要

objective c有優秀又好用的PrefixHeader
PrefixHeader的功用就是可以
存放一些全域變數 給任何Class呼叫使用
也可以使用來宣告APP所需到的文件
方便又好用 但轉變好Swift
似乎因為ClassClass之間變得開放
使得PrefixHeader沒有跟著過來
想使用的話 網路上只有找到混編譯
但我實在沒辦法接受語言不一致
那我們來試試看手刻一個自己的PrefixHeader
順便寫BaseController

PrefixHeader

PrefixHeader基本上放的全域變數
都是固定的參數 為了要簡化程式碼的長度
優化程式的可識別度 把一些常用攏長的語法
放置於PrefixHeader方便呼叫
也可以將APP色系統一設置於PrefixHeader
這樣如果要更換顏色風格或當作樣版的化
快速更換加速開發 讚讚

OC 寫法

PrefixHeader
基本使用 可以使用#define宣告

#define KScreenWidth ([[UIScreen mainScreen] bounds].size.width)
#define KScreenHeight [[UIScreen mainScreen] bounds].size.height
#define kScreenBounds [UIScreen mainScreen].bounds

other class
其他class就可以不用宣告直接使用該變數

NSLog(@"%f",KScreenWidth);
NSLog(@"%f",KScreenHeight);

PrefixHeader
也可以帶入參數
來查看該變數是否為空質

#define ValidNull(f) (f!=nil && [f isKindOfClass:[NSNull class]])

other class
這樣可以以防一些api回傳空質時
造成APP閃退

credits = ValidNull(credits)?@"0":credits;

目標在Swift上 做到這兩點
就可以滿足現階段需求

Swift

首先建立一個PrefixHeader.swift
設置一些常用的public let變數

PrefixHeader

import Foundation
import UIKit

public let KScreenWidth: CGFloat = UIScreen.main.bounds.size.width
public let KScreenHeight: CGFloat = UIScreen.main.bounds.size.height
public let kScreenBounds: CGRect = UIScreen.main.bounds

other class

print(KScreenWidth)
print(KScreenHeight)
print(kScreenBounds)

至於回傳值我打算寫個public func
應該就可以達成第二的目標

PrefixHeader

public func ValidInt(value: Any) -> Bool {return value is Int}

other class

if ValidInt(value:1) {
    print("yes")
}else{
    print("no")
}

輕鬆就完成兩項目標
當然要添加什麼自己決定
以上都可以換成自己想要的

BaseController

BaseController應該是許多人都會運用到的
可以先在BaseController寫好所需的功能
在給需要的Class繼承
就可以無痛使用父類別功能
我這邊習慣在viewDidLoad分別執行

  • 初始化變量
  • UI創建
  • 加載數據

依序執行funcviewDidload更整齊一點
也不會太多程式碼集中在同一個位置

BaseViewController
首先創建一個Swift檔
類別選擇UIViewController
接著在viewDidload新增以上三個func

import UIKit
class JGBaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 1、初始化變量
        self.initIMVariables()
        // 2、UI創建
        self.initIMUI()
        // 3、加載數據
        self.initIMData()
    }

    /**
     * 初始化變量
     */
    func initIMVariables() {
    }

    /**
     * UI創建
     */
    func initIMUI() {
    }
    
    /**
     * 加載數據
     */
    func initIMData() {
    }
}

*** 子類別Class ***
子類別Class 記得先要繼承 BaseController
別且使用override func添加剛剛三個父類別func

class Test2ViewController: JGBaseViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // MARK: - 供子類重寫
    /**
     * 初始化變量
     */
    override func initIMVariables() {
        super.initIMVariables()
        print("初始化變量")
    }
    
    /**
     * UI創建
     */
    override func initIMUI() {
        super.initIMUI()
        print("UI創建")
    }
    
    /**
     * 加載數據
     */
    override func initIMData() {
        super.initIMData()
        print("加載數據")
    }
}

在子類別viewDidLoad時就會順序
執行三個func到時候就可以依類別
填入適當的程式碼在func就可以了

** 執行結果 **

初始化變量
UI創建
加載數據

上一篇
[Day 4] Xcode安裝 為什麼有5000觀看??? ithelp觀察實驗 (後續)
下一篇
[Day 6] Swift 新增 collectionview + 客製化 cell
系列文
iOS APP 使用Swift打造一個外送平台APP (以foodpanda、Uber Eats為例) 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言